<?php
//关键代码段保护
// 启用异步信号处理
pcntl_async_signals(true);
// 设置信号处理函数
pcntl_signal(SIGINT, function ($signo) {
    echo "接收到 SIGINT 信号\n";
    exit(0);
});

pcntl_signal(SIGTERM, function ($signo) {
    echo "接收到 SIGTERM 信号\n";
});

echo "进程 PID: " . getmypid() . "\n";

// 在关键操作期间阻塞信号
function critical_operation()
{
    // 阻塞 SIGINT 和 SIGTERM 信号
    $signals_to_block = [SIGINT, SIGTERM];
    $old_signals = [];

    echo "开始关键操作 - 阻塞信号\n";
    pcntl_sigprocmask(SIG_BLOCK, $signals_to_block, $old_signals);

    // 执行关键操作
    for ($i = 0; $i < 5; $i++) {
        echo "关键操作步骤 {$i}...\n";
        sleep(1);
    }

    // 恢复之前的信号屏蔽字
    echo "关键操作完成 - 解除信号阻塞\n";
    print_r($old_signals);
    pcntl_sigprocmask(SIG_SETMASK, $old_signals);
}

critical_operation();

// 现在信号可以被正常处理
echo "等待信号...\n";
while (true) {
    sleep(1);
}